﻿using System.Collections.Generic;
using System.Globalization;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;

namespace Vallejos.Negocio
{
    public class NegocioFacade
    {
        private readonly CultureInfo _cultura;
        private Persona _persona;
        private string _urlPath;

        #region "Clases de negocio"

        private readonly SeguridadBLL _seguridad = new SeguridadBLL();
        private readonly ComunBLL _comun = new ComunBLL();
        private readonly ProductoBLL _producto = new ProductoBLL();
        private readonly ConcesionariaBLL _concesionaria = new ConcesionariaBLL();
        private readonly AnalisisCrediticioBLL _analisis = new AnalisisCrediticioBLL();
        private readonly SolicitudBLL _solicitud = new SolicitudBLL();
        private readonly PrestamoBLL _prestamo = new PrestamoBLL();
        
        #endregion

        #region Singleton
        private NegocioFacade() 
        {
            //Por default, si no se setea la cultura, es español - Argentina
            _cultura = new CultureInfo("es-AR");
        }
        private static NegocioFacade _instancia;

        

        public static NegocioFacade ObtenerInstancia()
        {
            return _instancia ?? (_instancia = new NegocioFacade());
        }

        #endregion

        #region Seguridad
        public Persona Autenticar(Usuario usuario)
        {
            return _persona = _seguridad.Autenticar(usuario, _cultura.LCID);
        }

        public void Desconectarse()
        {
            _persona = null;
        }

        public Persona Persona
        {
            get { return _persona; }
        }

        public string UrlPath
        {
            get { return _urlPath; }
            set { _urlPath = value;
                _analisis.UrlPath = value;
                _solicitud.UrlPath = value;
                _prestamo.UrlPath = value;
            }
        }

        public List<Perfil> BuscarPerfiles(Perfil perfil)
        {
            return _seguridad.BuscarPerfiles(perfil,_cultura.LCID);
        }

        public void GuardarPerfil(Perfil perfil)
        {
            _seguridad.GuardarPerfil(perfil);
        }

        public List<Ambito> LeerAmbitos()
        {
            return _seguridad.LeerAmbitos(_cultura.LCID);
        }

        public List<Permiso> LeerPermisos()
        {
            return _seguridad.LeerPermisos(_cultura.LCID);
        }

        public Perfil LeerPerfil(int idPerfil)
        {
            return _seguridad.LeerPerfil(idPerfil);
        }

        public List<Perfil> LeerPerfiles()
        {
            return _seguridad.LeerPerfiles();
        }

        public List<Persona> BuscarPersonas(Persona persona)
        {
            return _seguridad.BuscarPersonas(persona, _cultura.LCID);
        }

        public Persona LeerPersona(int idPersona)
        {
            return _seguridad.LeerPersona(idPersona, _cultura.LCID);
        }

        public Persona GuardarPersona(Persona persona)
        {
            return _seguridad.GuardarPersona(persona);
        }
        #endregion

        #region Comun
        public void AlmacenarEntidadEnEdicion<T>(T entidad)
        {
            _comun.AlmacenarEntidadEnEdicion(entidad);
        }

        public T RecuperarEntidadEnEdicion<T>()
        {
            return _comun.RecuperarEntidadEnEdicion<T>();
        }

        public List<Sexo> LeerSexos()
        {
            return _comun.LeerSexos(_cultura.LCID);
        }

        public List<Provincia> LeerProvincias()
        {
            return _comun.LeerProvincias();
        }

        public List<Localidad> LeerLocalidades(int idProvincia)
        {
            return _comun.LeerLocalidades(idProvincia);
        }
        #endregion

        #region Producto
        public List<Marca> LeerMarcas()
        {
            return _producto.LeerMarcas();
        }

        public List<Modelo> LeerModelos(int idMarca)
        {
            return _producto.LeerModelos(idMarca);
        }

        public List<TipoCombustible> LeerTiposCombustible()
        {
            return _producto.LeerTiposCombustible(_cultura.LCID);
        }

        public List<TipoFinanciacion> LeerTiposFinanciacion()
        {
            return _producto.LeerTiposFinanciacion(_cultura.LCID);
        }

        public List<UsoDeProducto> LeerUsosDeProducto()
        {
            return _producto.LeerUsosDeProducto(_cultura.LCID);
        }

        public List<TipoProducto> LeerTiposProducto()
        {
            return _producto.LeerTiposProducto(_cultura.LCID);
        }

        public Producto LeerProducto(int idProducto)
        {
            return _producto.LeerProducto(idProducto, _cultura.LCID);
        }

        public Producto GuardarProducto(Producto producto)
        {
            return _producto.GuardarProducto(producto);
        }
        public List<Producto> BuscarProductos(Producto producto, int desde, int hasta)
        {
            return _producto.BuscarProductos(producto, _cultura.LCID, desde, hasta);
        }
        public void RealizarConsulta(Consulta consulta)
        {
            _producto.RealizarConsulta(consulta);
        }

        public List<Consulta> LeerConsultasDeProducto(int idProducto)
        {
            return _producto.LeerConsultasDeProducto(idProducto);
        }
        #endregion

        #region IConcesionaria Members

        public List<Concesionaria> BuscarConcesionarias(Concesionaria concesionaria)
        {
            return _concesionaria.BuscarConcesionarias(concesionaria);
        }

        public Concesionaria GuardarConcesionaria(Concesionaria concesionaria)
        {
            return _concesionaria.GuardarConcesionaria(concesionaria);
        }

        public List<Concesionaria> LeerConcesionarias()
        {
            return _concesionaria.LeerConcesionarias();
        }

        public Concesionaria LeerConcesionaria(int idConcesionaria)
        {
            return _concesionaria.LeerConcesionaria(idConcesionaria);
        }

        #endregion

        #region IAnalisisCrediticio Members

        public SolicitudDeAnalisisCrediticio GenerarSolicitudDeAnalisis(SolicitudDeAnalisisCrediticio solicitud)
        {
            return _analisis.GenerarSolicitudDeAnalisis(solicitud, _cultura.LCID);
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisEnCurso(int idCliente)
        {
            return _analisis.LeerSolicitudDeAnalisisEnCurso(idCliente, _cultura.LCID);
        }

        public SolicitudDeAnalisisCrediticio LeerUltimaSolicitudDeAnalisisDenegada(int idCliente)
        {
            return _analisis.LeerUltimaSolicitudDeAnalisisDenegada(idCliente, _cultura.LCID);
        }

        public Solicitud LeerSolicitud(int idSolicitud)
        {
            return _solicitud.LeerSolicitud(idSolicitud, _cultura.LCID);
        }

        public void IniciarAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            _analisis.IniciarAnalisisCrediticio(solicitud);
        }

        public void RechazarSolicitudDeAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            _analisis.RechazarSolicitudDeAnalisisCrediticio(solicitud);
        }

        public void AceptarSolicitudDeAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            _analisis.AceptarSolicitudDeAnalisisCrediticio(solicitud);
        }

        public List<SolicitudDeAnalisisCrediticio> LeerSolicitudDeAnalisisCrediticioPendientes(int idEmpleado)
        {
            return _analisis.LeerSolicitudDeAnalisisCrediticioPendientes(idEmpleado, _cultura.LCID);
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisAprobadaDeCliente(string CUIL)
        {
            return _analisis.LeerSolicitudDeAnalisisAprobadaDeCliente(CUIL, _cultura.LCID);
        }
        public List<Rubro> LeerRubros()
        {
            return _analisis.LeerRubros(_cultura.LCID);
        }

        public List<EmpresaDeServicio> LeerEmpresasDeServicios()
        {
            return _analisis.LeerEmpresasDeServicios();
        }
        #endregion


        

        
    }


}